﻿package com.jacky.utils
{
	import flash.display.DisplayObject;
	import flash.geom.*;
	
	public class cgTransform
	{
		////////////////////////////////////////////////////////////////
		//将舞台坐标下的rect转换成某个容器坐标下的rect
		/////////////////////////////////////////////////////////////////
		public static function globalRectToLocal(o:DisplayObject,rect:Rectangle):Rectangle {
			var _ps:Array=[new Point(rect.left,rect.top),new Point(rect.right,rect.bottom)];
			_ps[0]=o.globalToLocal(_ps[0]);
			_ps[1]=o.globalToLocal(_ps[1]);
			return new Rectangle(_ps[0].x,_ps[0].y,_ps[1].x - _ps[0].x,_ps[1].y - _ps[0].y);
		}
		////////////////////////////////////////////////////////////////
		//将某个容器坐标下的rect转换成舞台坐标下的rect
		/////////////////////////////////////////////////////////////////
		public static function localRectToGlobal(o:DisplayObject,rect:Rectangle):Rectangle {
			var _ps:Array=[new Point(rect.left,rect.top),new Point(rect.right,rect.bottom)];
			_ps[0]=o.localToGlobal(_ps[0]);
			_ps[1]=o.localToGlobal(_ps[1]);
			return new Rectangle(_ps[0].x,_ps[0].y,_ps[1].x - _ps[0].x,_ps[1].y - _ps[0].y);
		}
		////////////////////////////////////////////////////////////////
		//对齐，与坐标点无关，当o的父对象有旋转时，会出现偏差
		//如果o==stage 不做改变
		//如果o==mainTimeline  对齐mainTimeline到舞台
		//如果target==null,target=stage
		//如果target=stage，与舞台对齐
		//例：Transform.alignTo
		//如果reference_o不为空，参考reference_o的rect进行对齐，一般reference_o是o内部的一个child
		/////////////////////////////////////////////////////////////////
		public static function alignTo(o:DisplayObject,target:DisplayObject=null,type:String="TL",reference_o:DisplayObject=null):void {
			if (o.stage==null  || o ==o.stage) {
				return;
			}
			var y_type=type.substr(0,1).toLocaleUpperCase();
			var x_type=type.substr(1,1).toLocaleUpperCase();
			var o_parent:DisplayObject=o.parent as DisplayObject;
			var t_r:Rectangle;
			if (target==null) {
				target=o.stage;
			}
			if (target==o.stage) {
				t_r=new Rectangle(0,0,target.stage.stageWidth,target.stage.stageHeight);
				t_r=globalRectToLocal(o_parent,t_r);
			} else {
				t_r=target.getRect(o_parent);
			}
			var o_r:Rectangle=reference_o ? reference_o.getRect(o_parent) : o.getRect(o_parent);
			switch (y_type) {
				case "T" :
					o.y+=t_r.top-o_r.top;
					break;
				case "B" :
					o.y+=t_r.bottom-o_r.bottom;
					break;
				case "C" :
					o.y+=(t_r.top+t_r.bottom-o_r.top-o_r.bottom)*.5;
					break;
				default :
		
			}
			switch (x_type) {
				case "L" :
					o.x+=t_r.left-o_r.left;
					break;
				case "R" :
					o.x+=t_r.right-o_r.right;
					break;
				case "C" :
					o.x+=(t_r.left+t_r.right-o_r.left-o_r.right)*.5;
				default :
			}
		}
		//根据不同的模式进行缩放：exactFit"、"showAll" 和 "noScale"。任何其它值都会将 _scale_mode 属性设置为默认值 "exactFit"。
		public static function scaleTo(o:DisplayObject, w:Number, h:Number, _scale_mode:String="exactFit") {
			switch (_scale_mode) {
			case "exactFit" :
				o.width = w;
				o.height = h;
				break;
			case "noScale" :
				break;
			default :
				//"showAll" is default
				var temp_w:Number = 0;
				var temp_h:Number = 0;
				if (o.width/w>o.height/h) {
					temp_w = w;
					temp_h = Math.round(o.height*w/o.width);
				} else {
					temp_w = Math.round(o.width*h/o.height);
					temp_h = h;
				}
				o.width = temp_w;
				o.height = temp_h;
				break;
			}
		}
	}
}